home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
9-Digit Zip Code Directory
/
9-Digit Zip Code Directory (American Business Information) (ABIZIP-12).ISO
/
z4src.zip
/
Z4ZXEXTR.C
< prev
next >
Wrap
C/C++ Source or Header
|
1995-07-29
|
8KB
|
297 lines
//----------------------------------------------------------------------------
// MODULE DESCRIPTION
//
// Module: z4zxextr.c
// Title: 9-Digit ZIP Code Directory -- on CD-ROM
// Notice: John M. Weeder
// Copyright (c) 1993. All rights reserved.
// This module contains proprietary information and should be
// treated as confidential.
//
//----------------------------------------------------------------------------
// MAINTENANCE HISTORY
//
// $Workfile$
// $Revision$
// $Author$
// $Date$
// $Log$
//
//----------------------------------------------------------------------------
// MODULE NARRATIVE
//
// This module contains the program entry point for
//
// The code in this module may be written in C++ or C.
//
// This module is portable to:
// DOS 3.X+
// MS Windows 3.X+
// OS/2 2.X+
// OS/2 2.0 PM
//
// The following compilers are supported:
// MSC 6.0A
// MSC/C++ 7.0
// Borland C++ 3.1 for DOS
// Borland C++ 1.0 for OS/2 2.X
//
//----------------------------------------------------------------------------
#include <z4.h>
//----------------------------------------------------------------------------
// Stack size
//----------------------------------------------------------------------------
#if COMPILER_BORLAND && (OS_DOS || OS_WINDOWS)
unsigned _stklen = 0x4000;
#endif
//----------------------------------------------------------------------------
// Globals
//----------------------------------------------------------------------------
#if OS_UNIX
#define MAX_ZX_BUF (100000)
#else
#define MAX_ZX_BUF (1000)
#endif
//
// A useless string which is simply embedded in the executable.
//
PSZ __pszCredits__ = "Written by John M Weeder, 1993";
//
// This should contain a program description which will be displayed as
// part of the program's help text.
//
static PCSZ pcszDescription =
"This program extracts unique ZIP+4 records from the ZIP+4 data file.";
//
// Program command line options
//
static BOOL fSuppress = FALSE;
static LONG lBlock = 0;
static CHAR szInput[MAX_PATH] = "z4.db";
static CHAR szOutput[MAX_PATH] = "z4zx.inp";
static BS_CMDOPT acmdopt[] =
{
{ "SUPPRESS", (PVOID)&fSuppress, CMDOPT_TRUE, "Suppress writing output."},
{ "BLOCK", (PVOID)&lBlock, CMDOPT_NUMERIC, "Start at specified block."},
{ "input", (PVOID)szInput, CMDOPT_FILESPEC(80), "Input file specification."},
{ "output", (PVOID)szOutput, CMDOPT_FILESPEC(80), "Output file specification."},
BS_CMDOPT_NULL,
};
//----------------------------------------------------------------------------
// Description: main() - Program entry point
// Parameters: Standard C parameters
// Returns: DOS return code.
//----------------------------------------------------------------------------
BOOL FN Write(PZ4_Z4 z4)
{
static CHAR szFormat[1024];
PCSZ pszRecType = Z4Z4RecordType(z4->rectype, Z4_DATA_ABBREV);
sprintf(szFormat,
"%-30.30s %-4s %-6s - %6s %*s** %s **\r\n"
"%-10s (%2d) - %-10s (%2d) %-2s %-20s (%-4s) %-4s %-2s\r\n"
"%s %-4s - %-4s\r\n\r\n",
z4->szSecName,
Z4Unit(z4->unit, Z4_DATA_ABBREV),
z4->szSecLo,
z4->szSecHi,
20 - strlen(pszRecType), "",
pszRecType,
z4->szPriLo, strlen(z4->szPriLo),
z4->szPriHi, strlen(z4->szPriHi),
Z4Directional(z4->predir, Z4_DATA_ABBREV),
z4->szPriName,
Z4SuffixAbbrev(z4->suffix2),
Z4SuffixAbbrev(z4->suffix1),
Z4Directional(z4->postdir, Z4_DATA_ABBREV),
z4->szZip5,
z4->szAddonHi,
z4->szAddonLo);
Output(szFormat);
return TRUE;
}
//----------------------------------------------------------------------------
// Description: main() - Program entry point
// Parameters: Standard C parameters
// Returns: DOS return code.
//----------------------------------------------------------------------------
int main(int argc, char **argv)
{
static BS_CFG cfg = CFG_DFT;
int retval = 99;
RECID recid;
HLF hlf;
Z4_Z4_BLK z4_z4_blk;
LONG lBlocks;
USHORT usBlockSize;
Z4_Z4 z4_z4;
Z4_Z4 z4_z4Save;
HF hfOutput = -1;
FLAG16 fsOutput = FL_CREATE|FL_TRUNCATE|FL_READWRITE|FL_DENYREADWRITE|FL_BINARY;
LONG lRecords = 0, lZip4 = 0;
PBYTE pbBlock, pb, pbBuf = NULL;
SIZET cRecSize, cBuf;
BYTE bKey[2][MAX_Z4_KEY];
SIZET cWhich = 0;
BOOL fNext = FALSE;
//
// Initialize base library
//
BaseLibraryInitialize(argc, argv, &cfg);
BaseTitle("$Revision: 93.1 $", __DATE__, __TIME__, "ZIP+4 Extracter");
if (!BaseTitleHelp(acmdopt, pcszDescription,NULL))
return 99;
cRecSize = sizeof(RECID) + MAX_ZIP5_BCD + MAX_ADDON_BCD + MAX_ADDON_BCD;
if ((pbBuf = MemAlloc(MAX_ZX_BUF * cRecSize)) == NULL)
{
ErrorNoMem();
return 99;
}
pb = pbBuf;
cBuf = 0;
DioSetDataPath(EnvGet("DATA"));
if (!DioOpenPhysical(szInput, NULL, FALSE)
|| !DioOpenLogical("ZIP4", &hlf, DFT_ISAM_DATA)
|| !Z4Z4ExpandInitialize(&z4_z4_blk)
|| !DioCacheSet(hlf, 1)
|| !DioGetBlockSize(hlf, &usBlockSize)
|| !DioGetBlocks(hlf, &lBlocks))
goto ERROR_EXIT;
if (!FnameQualify(szOutput, "inp", EnvGet("DATA"), 0))
return FALSE;
if (!FileOpen(&hfOutput, szOutput, fsOutput, NULL))
return FALSE;
#if OS_DOS
Output("\nPress escape to abort...\n\n");
#endif
memset(bKey, 0, sizeof(bKey));
for (recid.lBlock = lBlock; recid.lBlock < lBlocks; recid.lBlock++)
{
#if OS_DOS
while (KbdReady())
if (KbdChar() == '\x1B')
{
Output("\nAborted!\n");
return FALSE;
}
if ((recid.lBlock % 100L) == 0)
Output("\rBlock %ld / %ld", recid.lBlock, lBlocks);
#else
if ((recid.lBlock % 100L) == 0)
Output("Block %ld / %ld\n", recid.lBlock, lBlocks);
#endif
recid.usOffset = 0L;
if (!DioSeekBlock(hlf, recid.lBlock)
|| !DioReadBlock(hlf, NULL, &pbBlock, NULL)
|| !Z4Z4ExpandReset(&z4_z4_blk, pbBlock, (SIZET)usBlockSize))
goto ERROR_EXIT;
for (; Z4Z4Expand(&z4_z4_blk, &z4_z4); recid.usOffset++)
{ // Non-deliverable
lRecords++;
if (fNext)
{
Write(&z4_z4);
fNext = FALSE;
}
cWhich = !cWhich; // Compare keys
Z4Z4Key(bKey[cWhich], z4_z4.szFinance, z4_z4.szPriName, z4_z4.szPriLo);
if (memcmp(bKey[cWhich], bKey[!cWhich], MAX_Z4_KEY) < 0)
{
SIZET i;
CHAR szBuf[40];
Output("\nInvalid sort sequence at record %ld (%ld,%ld).\n",
lRecords, recid.lBlock, (LONG)recid.usOffset);
szBuf[0] = '\0';
for (i = 0; i < MAX_Z4_KEY; ++i)
sprintf(strchr(szBuf, '\0'), "%02X", bKey[!cWhich][i]);
Output("%s\n", szBuf);
szBuf[0] = '\0';
for (i = 0; i < MAX_Z4_KEY; ++i)
sprintf(strchr(szBuf, '\0'), "%02X", bKey[cWhich][i]);
Output("%s\n", szBuf);
Write(&z4_z4Save);
Write(&z4_z4);
fNext = TRUE;
}
z4_z4Save = z4_z4;
if (z4_z4.szAddonLo[0] == 'N'
|| z4_z4.szAddonHi[0] == 'N')
continue;
lZip4++;
if (!fSuppress)
{
if (cBuf >= MAX_ZX_BUF)
{
if (!FileWrite(hfOutput, pbBuf, cBuf * cRecSize, -1L))
goto ERROR_EXIT;
cBuf = 0;
pb = pbBuf;
}
*(PRECID)pb = recid; // Store record id
pb += sizeof(RECID); // Convert to bcd
stra2b(pb, MAX_ZIP5_BCD, z4_z4.szZip5, MAX_ZIP5);
pb += MAX_ZIP5_BCD;
stra2b(pb, MAX_ADDON_BCD, z4_z4.szAddonLo, MAX_ADDON);
pb += MAX_ADDON_BCD;
stra2b(pb, MAX_ADDON_BCD, z4_z4.szAddonHi, MAX_ADDON);
pb += MAX_ADDON_BCD;
cBuf++;
}
}
}
if (cBuf) // Flush buffer
if (!FileWrite(hfOutput, pbBuf, cBuf * cRecSize, -1L))
goto ERROR_EXIT;
retval = 0;
#if OS_DOS
Output("\rBlock %ld / %ld\n%ld Records\n%ld ZIP+4 Records\n",
recid.lBlock, lBlocks, lRecords, lZip4);
#else
Output("Block %ld / %ld\n%ld Records\n%ld ZIP+4 Records\n",
recid.lBlock, lBlocks, lRecords, lZip4);
#endif
ERROR_EXIT:
if (pbBuf != NULL)
MemFree(pbBuf);
if (hfOutput >= 0)
FileClose(hfOutput);
Z4Z4ExpandTerminate(&z4_z4_blk);
DioCloseAll();
return retval;
}
//----------------------------------------------------------------------------
//------------------------------- End of File --------------------------------
//----------------------------------------------------------------------------